package main

import "fmt"

//闭包 将匿名函数作为函数的返回值
/*
他最大的用处有两个：
可以读取函数内部的变量
变量的值始终保持在内存中
*/

func se() func() int {
	i := 0
	return func() int {
		i++
		return i
	}
}

func main() {
	//f就是 se()返回的匿名函数
	f := se()
	v := f()
	fmt.Println(v)
	v1 := f()
	fmt.Println(v1)
	//输出结果为：1,2
	/*****************区分上下两个代码的区别************************/
	f1 := se()
	v2 := f1()
	fmt.Println(v2)
	v3 := f1()
	fmt.Println(v3)
	//输出结果为：1,2

	//为了在使用闭包时避免内存泄漏，在使用完成之后最后将函数变量指向nil
	//便于GC回收
	f = nil
	f1 = nil

	/*
		结果分析：
		因为执行f：=se() 它是直接开辟一块内存将se的返回值压如栈中
		当执行f1:=se()  同样他是重新开辟的一块内存和之前f的内存是互不干扰的
	*/
}
